package cn.caplike.demo.nio._2021.buffer;

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.util.Objects;

/**
 * Description: 内存映射文件.
 *
 * @author LiKe
 * @version 1.0.0
 * @date 2022-01-18 12:30
 */
public class MappedByteBufferDemo {

    public static void main(String[] args) throws IOException {
        final RandomAccessFile randomAccessFile =
            new RandomAccessFile(
                Objects.requireNonNull(MappedByteBufferDemo.class.getResource("/data/mapped-byte-buffer-demo.txt")).getPath(),
                "rw"
            );
        final FileChannel fileChannel = randomAccessFile.getChannel();
        // 这个文件的内容被映射到内存里了. 只需要在内存上操作文件信息, 这个信息会被写到磁盘上. 不需要跟磁盘打交道, 只需要跟内存打交道就 OK 了.
        // MappedByteBuffer 是一种允许 JAVA 直接从内存直接访问文件的 Buffer. 可以实现非常迅速的 IO 操作.
        // 用于内存映射文件的的内存本身是堆外内存
        final MappedByteBuffer mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_WRITE, 0, 5); // 从0开始映射5个字节到内存中

        // 修改内存的值
        mappedByteBuffer.put(0, (byte) 'a');
        mappedByteBuffer.put(3, (byte) 'b');

        randomAccessFile.close();
    }
}
